package pl.rpr.rozklad;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

class KierunekZAutobusu implements Serializable {
  private static final long serialVersionUID = 1L;
  private String            kierunek;
  private List<String>      listaAdresowDoRozkladuPrzystanku;
  private List<String>      listaNazwPrzystankow;

  public KierunekZAutobusu() {
    this.kierunek = new String();
    this.listaAdresowDoRozkladuPrzystanku = new ArrayList<String>();
    this.listaNazwPrzystankow = new ArrayList<String>();
  }

  public KierunekZAutobusu(String kie, List<String> liA, List<String> liN) {
    this.kierunek = new String(kie);
    this.listaAdresowDoRozkladuPrzystanku = new ArrayList<String>(liA);
    this.listaNazwPrzystankow = new ArrayList<String>(liN);
  }

  public String getKierunek() {
    return kierunek;
  }

  public void setKierunek(String kierunek) {
    this.kierunek = new String(kierunek);
  }

  public List<String> getListaAdresowDoRozkladuPrzystanku() {
    return listaAdresowDoRozkladuPrzystanku;
  }

  public void setListaAdresowDoRozkladuPrzystanku(List<String> listaAdresowDoRozkladuPrzystanku) {
    this.listaAdresowDoRozkladuPrzystanku = new ArrayList<String>(listaAdresowDoRozkladuPrzystanku);
  }

  public List<String> getListaNazwPrzystankow() {
    return listaNazwPrzystankow;
  }

  public void setListaNazwPrzystankow(List<String> listaNazwPrzystankow) {
    this.listaNazwPrzystankow = new ArrayList<String>(listaNazwPrzystankow);
  }
}

class KierunkiZAutobusowAdapter extends ArrayAdapter<KierunekZAutobusu> {
  private List<KierunekZAutobusu> kierunki;
  private Context                 context;

  public KierunkiZAutobusowAdapter(Context context, int textViewResourceId, List<KierunekZAutobusu> objects) {
    super(context, textViewResourceId, objects);
    this.context = context;
    this.kierunki = objects;
  }

  @Override
  public int getCount() {
    return kierunki.size();
  }

  @Override
  public KierunekZAutobusu getItem(int position) {
    return kierunki.get(position);
  }

  @Override
  public long getItemId(int position) {
    return 0;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    String nazwaKierunku = kierunki.get(position).getKierunek();
    if (convertView == null) {
      convertView = LayoutInflater.from(context).inflate(R.layout.kierunki_z_autobusow, parent, false);
    }

    TextView kierunekTV = (TextView) convertView.findViewById(R.id.kierunekA3);
    kierunekTV.setText(nazwaKierunku);

    return convertView;
  }

}

public class KierunkiZAutobusow extends ListActivity implements CONST {
  private KierunkiZAutobusowAdapter adapter;
  private List<KierunekZAutobusu>   kierunki;
  private String                    adresDanegoAutobusu;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new Polaczenie(this).sprawdzPolaczenie();

    String adresAutobusow = ADRES_BAZOWY + getIntent().getExtras().getString("adresAutobusu");
    // To jest adres do konkretnego kierunku, np. 0001
    adresDanegoAutobusu = getIntent().getExtras().getString("adresAutobusu").substring(9, 14);

    String htmlDoParsowania = wczytajStringKierunkowZAutobusow(adresAutobusow);

    kierunki = parsujKierunekZAutobusow(htmlDoParsowania);

    adapter = new KierunkiZAutobusowAdapter(this, R.layout.kierunki_z_autobusow, kierunki);
    getListView().setAdapter(adapter);
  }

  @Override
  protected void onListItemClick(ListView parent, View view, int position, long id) {
    super.onListItemClick(parent, view, position, id);
    Intent intent = new Intent(view.getContext(), PrzystankiZKierunkowZAutobusow.class);
    intent.putExtra("kierunek", kierunki.get(position));
    intent.putExtra("adresDanegoAutobusu", adresDanegoAutobusu);
    startActivity(intent);
  }

  @Override
  protected void onResume() {
    super.onResume();
    new Polaczenie(this).sprawdzPolaczenie();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
    new Polaczenie(this).sprawdzPolaczenie();
  }

  private String wczytajStringKierunkowZAutobusow(String adresAutobusow) {
    HttpClient klient = new DefaultHttpClient();
    HttpGet zadanie = new HttpGet(adresAutobusow);
    HttpResponse odpowiedz = null;
    String htmlDoParsowania = null;
    InputStream strumienWejsciowy = null;
    BufferedReader czytnik = null;
    StringBuilder stringBuilder = new StringBuilder();
    String linia = null;

    try {
      odpowiedz = klient.execute(zadanie);
      strumienWejsciowy = odpowiedz.getEntity().getContent();
      czytnik = new BufferedReader(new InputStreamReader(strumienWejsciowy, "ISO-8859-2"));
      while ((linia = czytnik.readLine()) != null) {
        stringBuilder.append(linia);
      }
      strumienWejsciowy.close();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IllegalStateException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    htmlDoParsowania = stringBuilder.toString();
    return htmlDoParsowania;
  }

  private List<KierunekZAutobusu> parsujKierunekZAutobusow(String htmlDoParsowania) {
    ArrayList<KierunekZAutobusu> kierunki = new ArrayList<KierunekZAutobusu>();
    Pattern patKierunkow = Pattern.compile(RE_KIERUNKI_N);
    Pattern patListyList = Pattern.compile(RE_PRZYSTANKI_K_N);
    Pattern patListyAuto = Pattern.compile(RE_AUTOBUSY_P_K_N);

    Matcher matKierunkow = patKierunkow.matcher(htmlDoParsowania);
    Matcher matListyList = patListyList.matcher(htmlDoParsowania);

    // Wpisujemy najpierw nazwy kierunkow
    int i = 0;
    while (matKierunkow.find()) {
      KierunekZAutobusu tmp = new KierunekZAutobusu();
      tmp.setKierunek(matKierunkow.group(1));
      kierunki.add(tmp);
      ++i;
    } // Po tym mamy stworzone kierunki, potrzeba tylko wewnatrz uzupelnic
      // listy

    // Pozniej tworzymy listy list
    i = 0;
    while (matListyList.find()) {
      Matcher matListyAuto = patListyAuto.matcher(matListyList.group(1));
      ArrayList<String> listaAdresow = new ArrayList<String>();
      ArrayList<String> listaNazw = new ArrayList<String>();
      while (matListyAuto.find()) {
        String adres = matListyAuto.group(1).replace('r', 't');
        listaAdresow.add(adres);
        listaNazw.add(matListyAuto.group(2));
      }
      kierunki.get(i).setListaAdresowDoRozkladuPrzystanku(listaAdresow);
      kierunki.get(i).setListaNazwPrzystankow(listaNazw);
      ++i;
    }
    return kierunki;
  }

}
